package cn.java89.eurekaserver;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

/**
 * @author oldliu
 * @since 1.0
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // 禁用 CSRF 保护（适用于 REST ful API 和前后端分离项目）
                /*
                * Spring Security从6.1版本开始弃用了.csrf().disable()的写法，推荐使用Lambda表达式的方式。
                    修改内容：
                    将原来的.csrf().disable()替换为.csrf(csrf -> csrf.disable())
                    这种新的写法符合Spring Security 6.1+版本的推荐用法
                * */
                .csrf(csrf -> csrf.disable())
                // 配置请求权限
                .authorizeHttpRequests(authorize -> authorize
                        // 允许匿名访问 Eureka控制台、Swagger UI 和 API 文档
                        .requestMatchers(
                                "/",
                                "/eureka/**",
                                "/swagger-ui.html",
                                "/swagger-ui/**",
                                "/v3/api-docs/**",
                                "/admin/**",
                                "/api/**"
                        ).permitAll()

                        // admin 角色可以访问 /admin/** 路径,hasRole() 仅允许单个角色
                        .requestMatchers("/admin/**,/api/**").hasRole("ADMIN")
                        // user 角色可以访问 /user/** 路径,hasAnyRole() 允许多个角色
                        .requestMatchers("/user/**").hasAnyRole("USER")

                        // 其他所有请求需要认证
                        .anyRequest()
                        //authenticated() 仅允许已认证的用户
                        .authenticated()
                );
        return http.build();
    }
}
